package com.maweirdos.ai.core.memory.storage;

import com.maweirdos.ai.mapper.ChatMessageMapper;
import com.maweirdos.ai.core.memory.DatabaseChatMemoryRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.messages.Message;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 基于数据库持久化的对话记忆实现。
 * 使用 ChatMessageMapper 将完整的对话消息列表存储在数据库中。
 * 每个对话对应一条数据库记录，使用 chatId 字段存储对话的唯一标识符。
 * 对话历史以 JSON 格式存储在 messages 字段中。
 *
 * @author maweirdos
 * Create by 2025/7/2 11:35
 */
@Slf4j
@Component
public class DatabaseChatMemory implements ChatMemory {

    private final ChatMessageMapper chatMessageMapper;
    private final DatabaseChatMemoryRepository repository;

    /**
     * 构造函数,初始化ChatMessageMapper和DatabaseChatMemoryRepository
     * @param chatMessageMapper 消息Mapper
     * @param repository 消息存储库
     */
    public DatabaseChatMemory(ChatMessageMapper chatMessageMapper, 
                             DatabaseChatMemoryRepository repository) {
        this.chatMessageMapper = chatMessageMapper;
        this.repository = repository;
    }

    /**
     * 添加消息到指定会话
     * @param conversationId 会话ID
     * @param messages 消息列表
     */
    @Override
    public void add(String conversationId, List<Message> messages) {
        if (!StringUtils.hasText(conversationId) || messages == null || messages.isEmpty()) {
            log.warn("添加消息失败: 会话ID或消息列表为空...");
            return;
        }

        try {
            log.debug("添加{}条消息到会话{}...", messages.size(), conversationId);
            repository.saveAll(conversationId, messages);
        } catch (Exception e) {
            log.error("错误添加消息到会话 {}: {}", conversationId, e.getMessage(), e);
        }
    }

    /**
     * 获取指定会话的所有消息
     * @param conversationId 会话ID
     * @return 消息列表
     */
    @Override
    public List<Message> get(String conversationId) {
        if (!StringUtils.hasText(conversationId)) {
            log.warn("获取会话id失败: 会话ID为空...");
            return new ArrayList<>();
        }

        try {
            log.debug("会话ID： {}", conversationId);
            return repository.findByConversationId(conversationId);
        } catch (Exception e) {
            log.error("根据会话ID获取消息列表异常: {}: {}", conversationId, e.getMessage(), e);
            return new ArrayList<>();
        }
    }

    /**
     * 清除指定会话的所有消息
     * @param conversationId 会话ID
     */
    @Override
    public void clear(String conversationId) {
        if (!StringUtils.hasText(conversationId)) {
            log.warn("清除会话消息失败: 会话ID为空...");
            return;
        }

        try {
            log.debug("根据会话ID清除消息: {}", conversationId);
            repository.deleteByConversationId(conversationId);
        } catch (Exception e) {
            log.error("清除会话消息异常: {}: {}", conversationId, e.getMessage(), e);
        }
    }
}
